From 28b4567159ca47a3d914f6de38180464c3e59d3a Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Sun, 29 Aug 2010 17:48:58 +0200 Subject: [PATCH] x11: Keep a default X Colormap in every visual to construct windows with This way, we can specify a colormap when constructing windows. And ew must do that to avoid BadMatch from XCreateWindow when we use a different visual. --- gdk/x11/gdkprivate-x11.h | 2 ++ gdk/x11/gdkvisual-x11.c | 51 +++++++++++++++++++++++++++++++++++++++- gdk/x11/gdkwindow-x11.c | 2 +- 3 files changed, 53 insertions(+), 2 deletions(-) diff --git a/gdk/x11/gdkprivate-x11.h b/gdk/x11/gdkprivate-x11.h index 2e2edd4d9e..87dfaf32c5 100644 --- a/gdk/x11/gdkprivate-x11.h +++ b/gdk/x11/gdkprivate-x11.h @@ -56,6 +56,8 @@ struct _GdkCursorPrivate void _gdk_x11_error_handler_push (void); void _gdk_x11_error_handler_pop (void); +Colormap _gdk_visual_get_x11_colormap (GdkVisual *visual); + void _gdk_xid_table_insert (GdkDisplay *display, XID *xid, gpointer data); diff --git a/gdk/x11/gdkvisual-x11.c b/gdk/x11/gdkvisual-x11.c index 051f19ad91..a4d639d03a 100644 --- a/gdk/x11/gdkvisual-x11.c +++ b/gdk/x11/gdkvisual-x11.c @@ -38,6 +38,7 @@ struct _GdkVisualPrivate { Visual *xvisual; GdkScreen *screen; + Colormap colormap; }; struct _GdkVisualClass @@ -70,12 +71,26 @@ static const gchar *const visual_names[] = G_DEFINE_TYPE (GdkVisual, gdk_visual, G_TYPE_OBJECT) +static void +gdk_visual_finalize (GObject *object) +{ + GdkVisualPrivate *priv = (GdkVisualPrivate *) object; + + if (priv->colormap != None) + XFreeColormap (GDK_SCREEN_XDISPLAY (priv->screen), + priv->colormap); + + G_OBJECT_CLASS (gdk_visual_parent_class)->finalize (object); +} + static void gdk_visual_class_init (GdkVisualClass *visual_class) { GObjectClass *object_class = G_OBJECT_CLASS (visual_class); g_type_class_add_private (object_class, sizeof (GdkVisualPrivate)); + + object_class->finalize = gdk_visual_finalize; } static void @@ -84,6 +99,8 @@ gdk_visual_init (GdkVisual *visual) visual->priv = G_TYPE_INSTANCE_GET_PRIVATE (visual, GDK_TYPE_VISUAL, GdkVisualPrivate); + + visual->priv->colormap = None; } void @@ -241,7 +258,11 @@ _gdk_visual_init (GdkScreen *screen) for (i = 0; i < nvisuals; i++) { if (default_xvisual->visualid == visuals[i]->priv->xvisual->visualid) - screen_x11->system_visual = visuals[i]; + { + screen_x11->system_visual = visuals[i]; + visuals[i]->priv->colormap = DefaultColormap (screen_x11->xdisplay, + screen_x11->screen_num); + } /* For now, we only support 8888 ARGB for the "rgba visual". * Additional formats (like ABGR) could be added later if they @@ -632,6 +653,34 @@ gdk_visual_equal (Visual *a, return (a->visualid == b->visualid); } +/** + * _gdk_visual_get_x11_colormap: + * @visual: the visual to get the colormap from + * + * Gets the colormap to use + * + * Returns: the X Colormap to use for new windows using @visual + **/ +Colormap +_gdk_visual_get_x11_colormap (GdkVisual *visual) +{ + GdkVisualPrivate *priv; + + g_return_val_if_fail (GDK_IS_VISUAL (visual), None); + + priv = visual->priv; + + if (priv->colormap == None) + { + priv->colormap = XCreateColormap (GDK_SCREEN_XDISPLAY (priv->screen), + GDK_SCREEN_XROOTWIN (priv->screen), + GDK_VISUAL_XVISUAL (visual), + AllocNone); + } + + return priv->colormap; +} + /** * gdk_x11_visual_get_xvisual: * @visual: a #GdkVisual. diff --git a/gdk/x11/gdkwindow-x11.c b/gdk/x11/gdkwindow-x11.c index 820b3790b9..bbdd0805d0 100644 --- a/gdk/x11/gdkwindow-x11.c +++ b/gdk/x11/gdkwindow-x11.c @@ -784,7 +784,7 @@ _gdk_window_impl_new (GdkWindow *window, xattributes_mask |= CWBitGravity; - xattributes.colormap = GDK_COLORMAP_XCOLORMAP (draw_impl->colormap); + xattributes.colormap = _gdk_visual_get_x11_colormap (private->visual); xattributes_mask |= CWColormap; if (private->window_type == GDK_WINDOW_TEMP) -- 2.30.2